<?php
/**
 * Created by PhpStorm.
 * User: lxy
 * Date: 2016/1/15
 * Time: 15:35
 */

namespace app\lib;


class ImageTools
{
    static function getImageSize($dataBlock){
        // 将读取的图片信息转化为图片路径并获取图片信息,经测试,这里的转化设置 jpeg 对获取png,gif的信息没有影响,无须分别设置
        // 有些图片虽然可以在浏览器查看但实际已被损坏可能无法解析信息
        $size = getimagesize('data://image/jpeg;base64,'. base64_encode($dataBlock));
        if (empty($size)) {
            return false;
        }
        $result['width'] = $size[0];
        $result['height'] = $size[1];
        return [$result['width'], $result['height']];
    }

    /**
     * 生成缩略图
     * @author yangzhiguo0903@163.com
     * @param string     源图绝对完整地址{带文件名及后缀名}
     * @param string     目标图绝对完整地址{带文件名及后缀名}
     * @param int        缩略图宽{0:此时目标高度不能为0，目标宽度为源图宽*(目标高度/源图高)}
     * @param int        缩略图高{0:此时目标宽度不能为0，目标高度为源图高*(目标宽度/源图宽)}
     * @param int        是否裁切{宽,高必须非0}
     * @param int/float  缩放{0:不缩放, 0<this<1:缩放到相应比例(此时宽高限制和裁切均失效)}
     * @return boolean
     */
   public  function img2thumb($src_img, $dst_img, $width = 75, $height = 75, $cut = 0, $proportion = 0)
    {
        if(!is_file($src_img))
        {
            return false;
        }
        $ot = static::fileext($dst_img);
        $otfunc = 'image' . ($ot == 'jpg' ? 'jpeg' : $ot);
        $srcinfo = getimagesize($src_img);
        $src_w = $srcinfo[0];
        $src_h = $srcinfo[1];
        $type  = strtolower(substr(image_type_to_extension($srcinfo[2]), 1));
        $createfun = 'imagecreatefrom' . ($type == 'jpg' ? 'jpeg' : $type);

        $dst_h = $height;
        $dst_w = $width;
        $x = $y = 0;

        /**
         * 缩略图不超过源图尺寸（前提是宽或高只有一个）
         */
        if(($width> $src_w && $height> $src_h) || ($height> $src_h && $width == 0) || ($width> $src_w && $height == 0))
        {
            $proportion = 1;
        }
        if($width> $src_w)
        {
            $dst_w = $width = $src_w;
        }
        if($height> $src_h)
        {
            $dst_h = $height = $src_h;
        }

        if(!$width && !$height && !$proportion)
        {
            return false;
        }
        if(!$proportion)
        {
            if($cut == 0)
            {
                if($dst_w && $dst_h)
                {
                    if($dst_w/$src_w> $dst_h/$src_h)
                    {
                        $dst_w = $src_w * ($dst_h / $src_h);
                        $x = 0 - ($dst_w - $width) / 2;
                    }
                    else
                    {
                        $dst_h = $src_h * ($dst_w / $src_w);
                        $y = 0 - ($dst_h - $height) / 2;
                    }
                }
                else if($dst_w xor $dst_h)
                {
                    if($dst_w && !$dst_h)  //有宽无高
                    {
                        $propor = $dst_w / $src_w;
                        $height = $dst_h  = $src_h * $propor;
                    }
                    else if(!$dst_w && $dst_h)  //有高无宽
                    {
                        $propor = $dst_h / $src_h;
                        $width  = $dst_w = $src_w * $propor;
                    }
                }
            }
            else
            {
                if(!$dst_h)  //裁剪时无高
                {
                    $height = $dst_h = $dst_w;
                }
                if(!$dst_w)  //裁剪时无宽
                {
                    $width = $dst_w = $dst_h;
                }
                $propor = min(max($dst_w / $src_w, $dst_h / $src_h), 1);
                $dst_w = (int)round($src_w * $propor);
                $dst_h = (int)round($src_h * $propor);
                $x = ($width - $dst_w) / 2;
                $y = ($height - $dst_h) / 2;
            }
        }
        else
        {
            $proportion = min($proportion, 1);
            $height = $dst_h = $src_h * $proportion;
            $width  = $dst_w = $src_w * $proportion;
        }

        $src = $createfun($src_img);
        $dst = imagecreatetruecolor($width ? $width : $dst_w, $height ? $height : $dst_h);
        $white = imagecolorallocate($dst, 255, 255, 255);
        imagefill($dst, 0, 0, $white);

        if(function_exists('imagecopyresampled'))
        {
            imagecopyresampled($dst, $src, $x, $y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
        }
        else
        {
            imagecopyresized($dst, $src, $x, $y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
        }
        $otfunc($dst, $dst_img);
        imagedestroy($dst);
        imagedestroy($src);
        return true;
    }
   static function fileext($file)
    {
        return pathinfo($file, PATHINFO_EXTENSION);
    }
	
	 /**
     * 生成缩略图
     * @author yangzhiguo0903@163.com
     * @param string     源图绝对完整地址{带文件名及后缀名}     
     * @param int        缩略图宽{0:此时目标高度不能为0，目标宽度为源图宽*(目标高度/源图高)}
     * @param int        缩略图高{0:此时目标宽度不能为0，目标高度为源图高*(目标宽度/源图宽)}
     * @param int        是否裁切{宽,高必须非0}
     * @param int/float  缩放{0:不缩放, 0<this<1:缩放到相应比例(此时宽高限制和裁切均失效)}
     * @return boolean
     */
	public static function cacheImage($url,$width = 75, $height = 75, $cut = 0, $proportion = 0){
		$path='./cache/';
		if (!file_exists($path)){ 
			mkdir($path);
		} 
		$ext_name=static::fileext($url);
		$filename=$path.md5($url.(string)$width.(string)$height.(string)$cut.(string)$proportion).'.'.$ext_name;
		if(file_exists($filename)==false){
			$img = file_get_contents($url); 
			file_put_contents($filename,$img); 
			img2thumb($filename, $filename, $width , $height , $cut, $proportion );
		}		
		return $filename;
	}
//   demo:  <img src='<?=cacheImage('http://www.baidu.com/img/baidu_logo.gif',0,0,0,0.5);>'/>


//获取字体长宽  ttf
    static function get_bbox($text, $F_SIZE, $F_FONT)
    {
        return imagettfbbox($F_SIZE, 0, $F_FONT, $text);
    }

    static function text_height($text, $F_SIZE, $F_FONT)
    {
        $box = static::get_bbox($text, $F_SIZE, $F_FONT);
        $height = $box[3] - $box[5];
        return $height;
    }

    static function text_width($text, $F_SIZE, $F_FONT)
    {
        $box = static::get_bbox($text, $F_SIZE, $F_FONT);
        $width = $box[4] - $box[6];
        return $width;
    }

    //生成圆形图方画

    static function _get_lt_rounder_corner($radius, $r, $p, $g)
    {


        $img = imagecreatetruecolor($radius, $radius);

        $bgcolor = imagecolorallocate($img, $r, $p, $g);

        $fgcolor = imagecolorallocate($img, 0, 0, 0);

        imagefill($img, 0, 0, $bgcolor);

        imagefilledarc($img, $radius, $radius, $radius * 2, $radius * 2,
            180, 270, $fgcolor, IMG_ARC_PIE);

        imagecolortransparent($img, $fgcolor);

        return $img;

    }

    function _round_it($src_image)
    {
        $image_width = imagesx($src_image);
        $image_height = imagesy($src_image);

        if ($image_width < $image_height) {
            $imageSize = $image_width;
        } else {
            $imageSize = $image_height;
        }

        //$imageSize = 800;//$image_width;
        $radius = (int)$imageSize / 2;

        // create a new image, with src_width, src_height, and fill it with transparent color

        $image = imagecreatetruecolor($imageSize, $imageSize);

        $trans_color = imagecolorallocate($image, 255, 255, 255);

        imagefill($image, 0, 0, $trans_color);


        // then overwirte the source image to the new created image

        imagecopymerge($image, $src_image, 0, 0, 0, 0, $imageSize, $imageSize, 100);


        // then just copy all the rounded corner images to the 4 corners


        // lt

        $lt_corner = static::_get_lt_rounder_corner($radius, 52, 57, 79);

        imagecopymerge($image, $lt_corner, 0, 0, 0, 0, $radius, $radius, 100);

        // lb

        $lb_corner = imagerotate($lt_corner, 90, $trans_color);

        imagecopymerge($image, $lb_corner, 0, $imageSize - $radius, 0, 0,
            $radius, $radius, 100);

        // rb

        $rb_corner = imagerotate($lt_corner, 180, $trans_color);

        imagecopymerge($image, $rb_corner, $imageSize - $radius, $imageSize
            - $radius, 0, 0, $radius, $radius, 100);

        // rt

        $rt_corner = imagerotate($lt_corner, 270, $trans_color);

        imagecopymerge($image, $rt_corner, $imageSize - $radius, 0, 0, 0, $radius, $radius, 100);


        // set the transparency

        imagecolortransparent($image, $trans_color);


        return $image;
    }
























}